/*
 * @Description: In User Settings Edit
 * @Author: your name
 * @Date: 2019-08-13 09:04:35
 * @LastEditTime: 2019-08-13 13:51:04
 * @LastEditors: Please set LastEditors
 */
/*
 * @lc app=leetcode.cn id=6 lang=javascript
 *
 * [6] Z 字形变换
 *
 * https://leetcode-cn.com/problems/zigzag-conversion/description/
 *
 * algorithms
 * Medium (43.61%)
 * Likes:    358
 * Dislikes: 0
 * Total Accepted:    47.5K
 * Total Submissions: 107.5K
 * Testcase Example:  '"PAYPALISHIRING"\n3'
 *
 * 将一个给定字符串根据给定的行数，以从上往下、从左到右进行 Z 字形排列。
 * 
 * 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时，排列如下：
 * 
 * L   C   I   R
 * E T O E S I I G
 * E   D   H   N
 * 
 * 
 * 之后，你的输出需要从左往右逐行读取，产生出一个新的字符串，比如："LCIRETOESIIGEDHN"。
 * 
 * 请你实现这个将字符串进行指定行数变换的函数：
 * 
 * string convert(string s, int numRows);
 * 
 * 示例 1:
 * 
 * 输入: s = "LEETCODEISHIRING", numRows = 3
 * 输出: "LCIRETOESIIGEDHN"
 * 
 * 
 * 示例 2:
 * 
 * 输入: s = "LEETCODEISHIRING", numRows = 4
 * 输出: "LDREOEIIECIHNTSG"
 * 解释:
 * 
 * L     D     R
 * E   O E   I I
 * E C   I H   N
 * T     S     G
 * 
 */
/**
 * @description 二维数组方法
 * @param {string} s
 * @param {number} numRows
 * @return {string}
 */
var convert = function(s, numRows) {
    if(numRows == 1) return s
    const result = []
    for(let i=0;i<numRows;i++){
        result[i] = []
    }
    let i = 0 //横坐标
    let j = 0 // 竖坐标
    let status = true //为true的时候数值的写，false的时候斜着写
    s.split('').forEach((item,index)=>{
        result[j][i] = item
        if(status){
            j++
            if(j>=numRows) status = false,j-=2,i++
        }else if(!status){
            i++
            j--
            if(j<0) status = true,j=1,i--
        }

        
    })

    let str = ''
    result.forEach(item=>{
        item.forEach(item=>{
            if(item) str+=item
        })
    })
    return str
};





/**
 * @description: 子字符串方法
 * @param {type} 
 * @return: 
 */
var convert = function(s, numRows) {
    let s_length = 0  //每个子字符串的长度
    let s_num = 0 //子字符串的数量
    let result = ''
    if(numRows == 1) return s
    if(numRows > 1) s_length = (numRows-1)*2

    s_num = Math.ceil(s.length/s_length)

    for(let i=0;i<numRows;i++){ //竖着
        for(let j=0;j<s_num;j++){  // 横着
            byte=''
            bbyte=''
            if(i == 0){  //开始
                byte = s[j*s_length]
            }else if(i == numRows-1){// 结束
                byte = s[j*s_length + (numRows-1)]
            }else{
                byte=s[j*s_length+i]
                bbyte=s[(j+1)*s_length-i]
                // console.log('----',(j+1)*length-i)
            }
            if(byte) result+=byte
            if(bbyte) result+=bbyte
            
        }
    }
    return result
}

